package alt;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;

import model.Angebotstyp;
import model.LoginCredentials;
import model.Person;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import dao.AngebotstypDao;
import dao.PersonDao;

@Controller
public class AngebotController {
	SimpleDateFormat deutschesDatumsFormat = new SimpleDateFormat(
			"dd.MM.yyyy hh:mm");

	private static Logger log = Logger.getLogger(AngebotController.class);
	private AngebotDao angebotDao = null;
	private AngebotstypDao angebotstypDao = null;
	private LoginCredentials loginCredentials = null;

	public void setAngebotDao(AngebotDao angebotDao) {
		this.angebotDao = angebotDao;
	}

	public void setAngebotstypDao(AngebotstypDao angebotstypDao) {
		this.angebotstypDao = angebotstypDao;
	}

	public void setPersonDao(PersonDao personDao) {
	}

	public void setLoginCredentials(LoginCredentials loginCredentials) {
		this.loginCredentials = loginCredentials;
	}

	@RequestMapping(value = "/AlleAngebote.html", method = RequestMethod.GET)
	public ModelAndView findAll() {
		ModelAndView mv = new ModelAndView();
		mv.addObject("title", "Angebote");
		mv.addObject("message", "Unsere Angebote");
		mv.addObject("file", "list-angebote.jsp");
		mv.addObject("angebote", angebotDao.findAll());
		mv.setViewName("home");
		return mv;
	}

	@RequestMapping(value = "/EintragenAngebot.html", method = RequestMethod.GET)
	public ModelAndView eintragen_angebot() {
		ModelAndView mv = new ModelAndView();
		Date heute = new Date();
		Person select_person = new Person();
		SimpleDateFormat sdfToDate = new SimpleDateFormat("dd.MM.yyyy");

		Calendar cal = Calendar.getInstance();
		cal.setTime(heute);
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		heute = cal.getTime();
		if (loginCredentials.getId() == 0) {
			select_person.setId(21);
		} else {
			select_person.setId(loginCredentials.getId());
		}
		// List<Angebot> anbieter_angebote = angebotDao.getAngebotebyAnbieter(
		// select_person, heute);
		mv.addObject("title", "Angebot eintragen");
		// mv.addObject("message", "Details zu Ihrem Angebot");
		mv.addObject("file", "eintragenangebot.jsp");
		mv.addObject("angebotstyp", angebotstypDao.findAll());
		// mv.addObject("anbieter_angebote", anbieter_angebote);
		mv.addObject("datumformat", sdfToDate);
		mv.setViewName("home");
		return mv;
	}

	@RequestMapping(value = "/SaveAngebot.html", method = RequestMethod.POST)
	public ModelAndView save(@RequestParam("von") String von,
			@RequestParam("bis") String bis,
			@RequestParam Map<String, String> inputfields) {
		ModelAndView mv = new ModelAndView();

		SimpleDateFormat sdfToDate = new SimpleDateFormat("dd.MM.yyyy");
		Date von_datum = new Date();
		Date bis_datum = new Date();
		Date heute = new Date();
		boolean checkbox_clicked;
		List<Angebotstyp> alleAngebotstypen = angebotstypDao.findAll();
		List<String> errormsg = new ArrayList<String>();
		String msg = null;
		Person testperson = new Person();

		checkbox_clicked = false;
		// Setzen von den Zeitangaben auf Null damit man nur das Datum ohne Zeit
		// vergleicht
		Calendar cal = Calendar.getInstance();
		cal.setTime(heute);
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		heute = cal.getTime();

		// Datumskonvertierung für Von und Bis Datum
		try {
			von_datum = sdfToDate.parse(von);
		} catch (ParseException e) {
			// Datum fehlerhaft
			if (von != "")
				errormsg.add("Fehler bei der Datumskonvertierung");
		}

		try {
			bis_datum = sdfToDate.parse(bis);
		} catch (ParseException e) {
			// Datum fehlerhaft
			if (bis != "")
				errormsg.add("Fehler bei der Datumskonvertierung");
		}

		// Datum von muss kleiner bis sein
		if (bis_datum.before(von_datum)) {
			errormsg.add("Bis Datum muss kleiner als Von Datum sein!");
		}
		// Von Datum muss größer gleich Tagesdatum sein

		if (von_datum.before(heute)) {
			errormsg.add("Von Datum darf nicht in der Vergangenheit liegen!");
		}
		if (von == "")
			errormsg.add("Bitte Von Datum füllen!");

		if (bis == "")
			errormsg.add("Bitte Bis Datum füllen!");

		// prüfe ob eine Kategorie ausgewählt wurde
		for (Angebotstyp at : alleAngebotstypen) {
			if (inputfields.containsKey(at.getId().toString())) {
				checkbox_clicked = true;
			}
		}

		if (checkbox_clicked == false) {
			errormsg.add("Bitte eine Kategorie auswählen!");
		}
		log.info("+++" + checkbox_clicked);
		log.info("+++" + errormsg.toString());
		// Wenn keine Fehler aufgetreten sind, dann die Speicherung durchführen
		if (errormsg.isEmpty() == true && checkbox_clicked == true) {
			if (loginCredentials.getId() == 0) {
				testperson.setId(21);
			} else {
				testperson.setId(loginCredentials.getId());
			}

			for (Angebotstyp at : alleAngebotstypen) {
				if (inputfields.containsKey(at.getId().toString())) {
					Angebot angebot = new Angebot();
					angebot.setBis(bis_datum);
					angebot.setVon(von_datum);
					angebot.setAnbieter(testperson);
					Angebotstyp angebotstyp = new Angebotstyp();
					angebotstyp.setId(at.getId());
					angebot.setAngebotstyp(angebotstyp);
					angebotDao.save(angebot);
				}
			}
		}

		if (errormsg.isEmpty()) {
			msg = "Angebot erfolgreich gespeichert!";
		}

		if (errormsg.isEmpty() == false) {
			if (loginCredentials.getId() == 0) {
				testperson.setId(21);
			} else {
				testperson.setId(loginCredentials.getId());
			}
		}
		// List<Angebot> anbieter_angebote = angebotDao.getAngebotebyAnbieter(
		// testperson, heute);

		mv.addObject("title", "Angebot eintragen");
		mv.addObject("file", "eintragenangebot.jsp");
		mv.addObject("angebotstyp", angebotstypDao.findAll());
		mv.addObject("msg", msg);
		mv.addObject("von", von);
		mv.addObject("bis", bis);
		mv.addObject("errormsg", errormsg);
		mv.addObject("inputfields", inputfields);
		// mv.addObject("anbieter_angebote", anbieter_angebote);
		mv.addObject("datumformat", sdfToDate);
		mv.setViewName("home");
		return mv;
	}

	@RequestMapping(value = "/LoescheAngebot.html", method = RequestMethod.GET)
	public ModelAndView deleteAngebotSingle(
			@RequestParam(value = "id", required = false) int id) {
		ModelAndView mv = new ModelAndView();
		String msg = "";
		List<String> errormsg = new ArrayList<String>();

		Angebot del_angebot = angebotDao.findById(id);
		try {
			angebotDao.delete(del_angebot);
		} catch (Exception e) {
			errormsg.add(e.getMessage());
		}
		if (errormsg.isEmpty() == true) {
			msg = "Angebot erfolgreich gelöscht!";
		}
		Date heute = new Date();
		Person select_person = new Person();
		SimpleDateFormat sdfToDate = new SimpleDateFormat("dd.MM.yyyy");

		Calendar cal = Calendar.getInstance();
		cal.setTime(heute);
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		heute = cal.getTime();
		if (loginCredentials.getId() == 0) {
			select_person.setId(21);
		} else {
			select_person.setId(loginCredentials.getId());
		}
		// List<Angebot> anbieter_angebote = angebotDao.getAngebotebyAnbieter(
		// select_person, heute);
		mv.addObject("title", "Angebot eintragen");
		mv.addObject("file", "eintragenangebot.jsp");
		mv.addObject("angebotstyp", angebotstypDao.findAll());
		// mv.addObject("anbieter_angebote", anbieter_angebote);
		mv.addObject("datumformat", sdfToDate);
		mv.addObject("errormsg", errormsg);
		mv.addObject("msg", msg);
		mv.setViewName("home");
		return mv;

	}

	public static Logger getLog() {
		return log;
	}

	public static void setLog(Logger log) {
		AngebotController.log = log;
	}

}
